iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0

昨天介紹完單層感知機模型演算法,今天要來研究單層感知機模型程式:
首先先把x資料做標準化

#個別標準化處理
x['x1']=(x['x1']-np.mean(x['x1']))/np.std(x['x1'])
x['x2']=(x['x2']-np.mean(x['x2']))/np.std(x['x2'])
x['x3']=(x['x3']-np.mean(x['x3']))/np.std(x['x3'])

print(x)

結果如下:

x1        x2        x3
0  0.132453  0.707423 -0.324462
1 -0.927173 -0.771813 -0.633474
2 -0.662266 -1.380911 -1.096991
3  0.132453 -0.293237  2.147631
4  2.516611  1.264312 -0.169956
5 -0.662266 -0.750060  0.293561
6 -0.927173 -0.249730 -0.942485
7  0.927173  1.647173 -0.324462
8 -0.397360  0.903204  1.529608
9 -0.132453 -1.076362 -0.478968

好,接下來依照多元回歸,要加上截距項係數1:

x['b0']=1
print(x)

所以x資料就會變成:

x1        x2        x3  b0
0  0.132453  0.707423 -0.324462   1
1 -0.927173 -0.771813 -0.633474   1
2 -0.662266 -1.380911 -1.096991   1
3  0.132453 -0.293237  2.147631   1
4  2.516611  1.264312 -0.169956   1
5 -0.662266 -0.750060  0.293561   1
6 -0.927173 -0.249730 -0.942485   1
7  0.927173  1.647173 -0.324462   1
8 -0.397360  0.903204  1.529608   1
9 -0.132453 -1.076362 -0.478968   1

好,現在取前6筆當train後4筆當test,程式如下:

#取前6筆當train
x_train=x.loc[:5]
#取後4筆當test
x_test=x.loc[6:]
print(x_train)
print(x_test)

y_train=y.loc[:5]
y_test=y.loc[6:]

print(y_train)
print(y_test)

接下來定義誤差和學習率跟設定初始權重
程式如下:

#定義誤差容許值
err_check = 3.0

#定義學習率a
a = 0.05

#設定初始權重(因為有4個)-->用0~1之間的數字
w = np.random.uniform(0,1,4)
print(w)
#迭帶次數初始化
j=1

所以東西都設定好之後,就帶入迴圈:

while True:
    err = 0
    for i in range(len(x_train)):
        xi = x_train.iloc[i]
        #每一筆數據的估計值和真實值之間差距
        delta = sum(w*xi) - y_train.iloc[i]
        #梯度下降
        w = w - a*delta*xi
        #加總全誤差
        err = err + delta**2
    if err<err_check:
    	break
	j+=1
#最後權重    
print("最後權重",w)

結果如下:

第 1 次誤差: 2514.475600015955
第 2 次誤差: 1122.517976696326
第 3 次誤差: 536.2183368067888
第 4 次誤差: 267.1491980566654
第 5 次誤差: 138.1212899719169
第 6 次誤差: 74.86140081797406
第 7 次誤差: 43.39858391807849
第 8 次誤差: 27.509587072742484
第 9 次誤差: 19.29828752645391
第 10 次誤差: 14.891503014883892
第 11 次誤差: 12.38340474428632
第 12 次誤差: 10.834745064265665
第 13 次誤差: 9.781894680740534
第 14 次誤差: 8.995331217720498
第 15 次誤差: 8.360752340474864
第 16 次誤差: 7.820559609915683
第 17 次誤差: 7.345072473543037
第 18 次誤差: 6.918379442228294
第 19 次誤差: 6.5313914204590136
第 20 次誤差: 6.178435490364901
第 21 次誤差: 5.855586700477396
第 22 次誤差: 5.5598513534328395
第 23 次誤差: 5.2887663458100995
第 24 次誤差: 5.040201089221789
第 25 次誤差: 4.812257659580057
第 26 次誤差: 4.603218367670186
第 27 次誤差: 4.411516151619314
第 28 次誤差: 4.235715969835322
第 29 次誤差: 4.074501569242124
第 30 次誤差: 3.926664985200385
第 31 次誤差: 3.7910975487051513
第 32 次誤差: 3.666781841715461
第 33 次誤差: 3.552784346605619
第 34 次誤差: 3.4482486713465024
第 35 次誤差: 3.3523892895601275
第 36 次誤差: 3.264485757316709
第 37 次誤差: 3.1838773765485424
第 38 次誤差: 3.109958277295673
第 39 次誤差: 3.0421728915578936
第 40 次誤差: 2.9800117918450866
最後權重
 x1     9.784756
x2    -2.149323
x3    -0.696641
b0    17.955527

很明顯可以看到誤差慢慢在下降
把上述得到權重帶回test,程式如下:

#預測值
y_hat=np.sum(x_test*w,axis=1)
print("每筆資料預測值:\n",y_hat)
#真實值
print("每筆資料真實值:\n",y_test)
#MSE
print("MSE:",np.mean((y_test -y_hat )**2))

結果如下:

每筆資料預測值:
 6    10.070166
7    23.702478
8    11.048403
9    19.311501
每筆資料真實值:
 6    12.03
7    29.00
8    21.50
9    13.75
MSE: 43.017715641520184

能看出MSE還是比較來的大(畢竟是單層感知機模型)

好,今天單層感知機模型算是完成,明天就來研究淺層網路神經

男孩站起身來,但眼神失了焦,而彷彿甚麼也沒看到的緩慢往前走,途中掉落木棉花在碰到男孩瞬間,花就立刻枯萎腐爛,然後消失在空氣中,男孩前進方向正是森林的入口,隨著男孩身影逐漸遠去,眾人發現身體又可以活動了,在第一時間,狐狸想立刻去追男孩,但他突然發現,他無法出去,在掉落木棉花上方,像是有一道無形的牆,而掉落木棉花正好形成一個圓圈,把眾人都困在裡面,男子伸出紅色的手,想企圖用火焰把牆燒掉,但卻毫無反應,娃娃抬起手,也毫無反應,這時透明牆上出現一段紅色字體,上面寫:
過去是疼痛,現在是折磨,未來是孤獨
           --|我失去了過去,看清了現在,至於未來…|--  MM.CS

上一篇
DAY22神經網路
下一篇
DAY24神經網路(續二)
系列文
數據分析方法研究和理解演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言